(for Internet Explorer)
Sub  BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
  ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
WriteOffset
(src)
ReadBinaryArray
ReadOffset
Size
コピー元となるバイナリ配列
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
Sub  BinaryArray::WriteFromDump( in_Offset  as integer,  in_Dump  as string )
文字列にダンプされたバイナリーデータを、バイナリ配列の内容の一部に、ライトします。
【引数】
in_Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリーデータをダンプした文字列
in_Dump
サンプル
→ System.vbs
ソース
    bin.WriteFromDump  %h10, "0x05 | 0x14, 0x1234, 0x98765432"
    '// bin = 0x0010 : 15 34 12 32 54 76 98
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を、格納します。
    bin.WriteFromDump  0, "12 34 56 78"
    '// bin = 0x0000 : 12 34 56 78
in_Dump 引数の中の、16進数と | 演算子以外は無視されます。 16進数は、接頭辞 0x を付けるか、
接頭辞を付けないでください。 | 演算子は、論理和です。
無視される文字を除き、16進数が連続すると次のデータであるとして処理します。
16進数の桁数がに応じて、整数のビット数が異なります。 2, 4, 8 桁なら、リトル エンディアンの
8, 16, 32 ビット整数になります。
テスト
T_Binary_FromDump
→ T_Binary.vbs
Function  BinaryArray::Compare( ThanBinary as BinaryArray )
バイナリ配列を比較します。
【引数】
ThanBinary
比較対象のバイナリ配列
テスト
→ T_Binary.vbs
→ System.vbs
ソース
返り値
一致=0、StrComp と同じ
関連
Sub  BinaryArray::SwapEndian( Offset as integer, Size as integer, SwapUnitSize as integer )
バイナリ配列の一部のエンディアンを逆にします。
【引数】
Offset
エンディアンを逆にする範囲の先頭オフセット
エンディアンを逆にする範囲のサイズ(バイト)
Size
サンプル
  '// bin = 12 34 56 78 9A BC DE
  bin.SwapEndian  &h2, &h4, 2
  '// bin = 12 56 34 9A 78 BC DE
バイナリ配列 bin の 0x2 の位置から始まる 4バイトの範囲を、2バイト単位(2バイト整数)で逆にします。
SwapUnitSize
逆にする単位
テスト
→ T_Binary.vbs
→ System.vbs
ソース
Sub  BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
<BinaryArray size="6">
FF FE 6F 30 80 30
</BinaryArray>
出力例:
(src)
echo  ReadBinaryFile( "Sample.zip" ).MD5
バイナリー・データ(配列の全体)に対する ハッシュ値。
テスト
サンプル
ソース
→ System.vbs
→ T_Binary.vbs
→ MD5
関連
MD5 ハッシュ値は、0〜9, a〜f の文字が32文字の文字列になります。
SHA-1 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256 ハッシュ値は、0〜9, a〜f の文字が64文字の文字列になります。
Property Get  BinaryArray::SHA1() as string
キーワード:
Property Get  BinaryArray::SHA256() as string
SHA-256, SHA-384, SHA-512, RIPEMD-160 は、Windows Vista 以降で使えます。
Property Get  BinaryArray::SHA384() as string
Property Get  BinaryArray::SHA512() as string
SHA-384 ハッシュ値は、0〜9, a〜f の文字が96文字の文字列になります。
SHA-512 ハッシュ値は、0〜9, a〜f の文字が128文字の文字列になります。
RIPEMD-160 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
Property Get  BinaryArray::RIPEMD160() as string
→ ハッシュ値
5c1d447971bc0c49f09b2e965ac4ed37
… 表示例
文字列からハッシュ値を得る場合
→ PowerShell - MD5を計算する
ファイルの内容が異なれば、ハッシュ値も異なります。 内容が異なるのにハッシュ値が
同じになる(衝突する)確率はわずかにありますが、実用的には問題ありません。
ファイルの内容のごく一部だけ変えたときは、衝突しません。 なぜなら、衝突させるには、
ハッシュ アルゴリズムによって決まる法則で、ファイルの内容の全体を合わせる必要が
あるからです。
なお、ファイルのハッシュ値は、
でも確認できます。
注意
バイナリ ファイルのハッシュ値を計算するときは、
をお使い
ください。 ReadBinaryFile は、データをすべてリードしてからハッシュ値を計算
するため、メモリー不足が発生する可能性があります。
Sub  Main()
    Set c = g_VBS_Lib

    path = InputPath( "zipファイルのパス >", c.CheckFileExists )
    echo  GetVersionString( path )
End Sub

Dim  g_VersionDataBase : g_VersionDataBase = Array(_
    "c28bae2972d4e9c9f90ed1861f0b8002", "vbslib, 4.00, 2012-07-02",_
    "700af264a9f00733b4d26f0407625d5b", "vbslib, 4.01, 2013-02-14" )

Function  GetVersionString( Path )
    If IsArray( g_VersionDataBase ) Then _
        Set g_VersionDataBase = Dict( g_VersionDataBase )

    value_of_MD5 = ReadBinaryFile( Path ).MD5
    If g_VersionDataBase.Exists( value_of_MD5 ) Then
        GetVersionString = g_VersionDataBase( value_of_MD5 )
    Else
        GetVersionString = "Unknown"
    End If
End Function
zip などのパッケージ・ファイルのバージョンを MD5 から判定するソース・コードのサンプル
を示します。
関連
  Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
  echo  bin.Base64
バイナリー・データ(配列の全体)に対する Base64 でエンコードされた文字列。
サンプル
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
関連
→ Base64
参考
バイナリー・データを指定した文字コードセットの文字列とし、VBScript の文字列を返します。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
文字コードセット一覧
Set shift_JIS_bin = new_BinaryArray( Array( &h8A, &hBF, &h8E, &h9A ) )
Assert  shift_JIS_bin.Text( "Shift-JIS" ) = "漢字"
サンプル
VBScript の文字列を指定した文字コードセットに変える
echo  GetHashOfFile( "A.bin", "MD5" )
Function  GetHashOfFile( in_Path as string,  in_HashType as string ) as string
ファイルのハッシュ値を計算します。 内部で ADODB か Power Shell を使います。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
内部の ADODB でメモリー不足が発生したら、Power Shell を使用します。
関連
echo  GetHashPS( "A.bin", "MD5" )
Function  GetHashPS( in_Path as string,  in_HashType as string ) as string
ファイルのハッシュ値。 内部で Power Shell 使用。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式をリードします。
参考
Function  OpenForReadRIFF( in_Path as string ) as RIFF_Reader
RIFF 形式バイナリーファイルのリードを開始します。
【引数】
入力ファイルのパス
in_Path
返り値
内容をリードするときに使うオブジェクト
    Set bin = OpenForReadRIFF( "riff.bin" )

    Set chunk = bin.ReadFirstChild()  '// chunk as RIFF_ChunkClass
    Assert  chunk.FourCC = "Set "
    Assert  bin.Stack( 0 ).FourCC = "Root"
    Assert  bin.Stack( 1 ).FourCC = "Set "

    Set chunk = bin.ReadFirstChild()
    Assert  chunk.FourCC = "Elem"
    Assert  chunk.Size = 5
    Assert  not chunk.IsExistChild
    Assert  not chunk.IsExistNextSibling

    bin.ReadStruct  data, Array( _
        "a", vbByte+vbArray, 3, "b", vbInteger ) )
    Assert  data("a")(0) = &h41
    Assert  data("a")(1) = &h42
    Assert  data("a")(2) = &h43
    Assert  data("b") = &h4544  '// リトルエンディアン

    bin.ReturnToParent
    Set chunk = bin.ReadNextSibling()
    Assert  chunk.FourCC = "Elm2"
サンプル
RIFF( 'Root'
    LIST( 'Set '
        'Elem'( &h41, &h42, &h43, &h44, &h45 )
    )
    'Elm2'( &h58, &h59, &h5A )
)
上記のスクリプトは、下記のツリー構造をたどっています。
→ System.vbs
ソース
テスト
→ T_Binary.vbs
Function  RIFF_Reader::SeekChunkByIndexes( in_Empty as Empty,
    in_Indexes0_Array as array of integer ) as RIFF_ChunkClass
インデックス番号で指定したチャンクにジャンプして、リードします。
【引数】
in_Empty
Empty = ルート チャンクからたどる
テスト
→ T_Binary.vbs
T_RIFF_SeekChunkByIndexes
ソース
→ System.vbs
リードしたチャンクに関する情報
返り値
in_Indexes0_Array
インデックス番号の配列
RIFF チャンク
LIST チャンク
要素チャンク
要素チャンク
要素チャンク
要素チャンク
サンプル
Set chunk = a_RIFF.SeekChunkByIndexes( Empty, Array( 2, 0 ) )
Array( )
in_Indexes0_Array 引数の位置関係:
Array( 0 )
Array( 1 )
Array( 2 )
Array( 2, 0 )
Array( 2, 1 )
Function  RIFF_Reader::ReadFirstChild() as RIFF_ChunkClass
現在位置にあるリスト チャンクの、子チャンクのヘッダーをリードします。
【引数】
返り値
リードした子チャンクに関する情報
::IsExistChild = False のときに呼び出すとエラーになります。
Function  RIFF_Reader::ReadNextSibling() as RIFF_ChunkClass
現在位置の次の兄弟チャンクのヘッダーをリードします。
【引数】
返り値
リードした兄弟チャンクに関する情報
::IsExistNextSibling = False のときに呼び出すとエラーになります。
Function  RIFF_Reader::ReadStruct( out_Dic as dictionary,
    FormatArray as integer ) as integer
現在位置のチャンクの内容をリードし、辞書に格納します。
【引数】
(出力) チャンクの内容が入った辞書
out_Dic
返り値
抽出した部分のバイナリの大きさ(バイト)
バイナリ配列から抽出する部分の型の集合
FormatArray
参考
Function  RIFF_Reader::ReturnToParent() as RIFF_ChunkClass
現在位置を親チャンクに移動します。
【引数】
返り値
親チャンクに関する情報
.Offset
.FourCC
チャンクのヘッダーをリードして得られたチャンクに関する情報。
.Size
.IsExistChild
.IsExistNextSibling
チャンクの先頭の位置。 0 が先頭
チャンクの名前に相当する FourCC (4文字の文字列)
チャンクに入っているデータのサイズ(バイト)
子チャンクがあるかどうか
次の兄弟チャンクがあるかどうか
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式を作成します。
参考
    Set w_=AppKey.NewWritable( "." ).Enable()

    Set bin = OpenForWriteRIFF( "riff.bin", "Root" )
    bin.WriteLIST   "Set "
    bin.WriteChunk  "Elem"
    bin.WriteStruct  Array( vbByte, Array( &h41, &h42, &h43 ) )
    bin.WriteStruct  Array( vbInteger, Array( &h4544 ) )
    bin.WriteEnd            '// End of "Elem" chunk
    bin.WriteEnd            '// End of "Set " chunk
    bin.WriteChunk  "Elm2"
    bin.WriteStruct  Array( vbByte, Array( &h58, &h59, &h5A ) )
    bin = Empty
サンプル
RIFF( 'Root'
    LIST( 'Set '
        'Elem'( &h41, &h42, &h43, &h44, &h45 )
    )
    'Elm2'( &h58, &h59, &h5A )
)
52 49 46 46  2A 00 00 00  52 6F 6F 74
4C 49 53 54  12 00 00 00  53 65 74 20
45 6C 65 6D  05 00 00 00  41 42 43 44 45 00
45 6C 6D 32  03 00 00 00  58 59 5A 00
RIFF 0x0000002A Root
LIST 0x00000012 Set
Elem 0x00000005 0x41 0x42 0x43 0x44 0x45
Elm2 0x00000003 0x58, 0x59, 0x5A
上記のスクリプトは、以下のバイナリーファイルを作ります。
Function  OpenForWriteRIFF( in_Path as string, in_RootFourCC as string ) as RIFF_Writer
RIFF 形式バイナリーファイルのライトを開始します。
【引数】
出力ファイルのパス
in_Path
in_RootFourCC
ルートチャンクの名前に相当する FourCC (4文字の文字列)
返り値
内容をライトするときに使うオブジェクト
テスト
→ System.vbs
ソース
→ T_Binary.vbs
Sub  RIFF_Writer::WriteLIST( in_FourCC as string )
リスト チャンクのヘッダーを出力します。
【引数】
in_FourCC
出力するリスト チャンクの名前に相当する FourCC (4文字の文字列)
次は、
リストを終了するときは、
WriteEnd
を呼び出してください。
WriteLIST
のどちらかのチャンクのヘッダーをライトします。
Sub  RIFF_Writer::WriteLIST( in_FourCC as string )
リスト以外のチャンクのヘッダーを出力します。
【引数】
in_FourCC
出力するチャンクの名前に相当する FourCC (4文字の文字列)
次は、
でライトします。
Sub  RIFF_Writer::WriteStruct( FormatAndDataArray as array )
構造化した配列を使って、現在のチャンクに、バイナリーデータをライトします。
【引数】
連続して WriteStruct を呼び出すと、同じチャンクの中の続きをライトします。
バイナリ配列へライトする部分の型とライトする値の集合
FormatAndDataArray
参考
でチャンク(のサイズ)を確定します。
Sub  RIFF_Writer::WriteEnd()
チャンクのサイズを確定します。 現在のチャンクのライトを終了したときに呼び出します。
または
でライトしたチャンクのヘッダーの一部にある
サイズ情報の部分に、適切な値をライトします。
のどちらかを呼び出したときは、
WriteEnd を呼び出す前のチャンクの親の兄弟のチャンクがライトされます。
本関数を呼び出した後で、
本関数は、
ルートのチャンクになるまで、WriteEnd を呼び出す必要はありません。 RIFF_Writer クラス
のオブジェクトが削除されるタイミングで、足りなかった WriteEnd 呼び出しを内部で自動
的に行い、OpenForWriteRIFF 関数の引数に指定したファイルに出力します。
Sub  RIFF_Writer::WritePadding( in_FourCC  as string,  in_Alignment  as integer )
次のバイナリーデータのアラインメントを揃えるために、パディングするチャンクをライトします。
【引数】
in_FourCC
in_Alignment
パディングをするチャンクの FourCC
アラインメント
→ チャンクの中のデータの先頭をアラインメントするには
参考
   :
'Pad ' FourCC  ... ライトする範囲の最初
padding_size
padding        ... ライトする範囲の最後
'Data' FourCC  ... WritaStruct 関数でライト
data_size
data     ... アラインメントが揃う位置
下記の data のアラインメントを揃えるために、下記の 'Pad ' チャンクをライトします。
テスト
ソース
→ T_LeafPath.vbs
T_FileHashCache
→ ToolsLib.vbs
ファイルのハッシュ値(MD5)のキャッシュ。
キーはフル パス、アイテムはハッシュ値(リード オンリー)である辞書。
プロセス起動後、初めて指定されたファイルのときだけ、ハッシュ値を計算します。
大量のファイルを何度も比較するときに使うと、高速になります。
Assert  g_FileHashCache( "C:\A.txt" ) = "9060587edeb01a63e3d3edc959678d1e"
参考
g_FileHashCache に入るオブジェクトは、ToolsLib.vbs を include するときに作成されます。
キーがフォルダーのパスのときのアイテムは、"Folder" です。
ただし、フォルダーが空のときは、"EmptyFolder" です。
キーがファイルやフォルダーのパスではないときのアイテムは、"" です。
ファイルの変更があったときは、Remove メソッド、RemoveAll メソッドでキャッシュを破棄してください。
g_FileHashCache.RemoveAll
g_FileHashCache.CopyRenFile  "Source.txt", "Destination.txt"
ハッシュ値の計算と、ファイルのコピーを同時にするときは、CopyRenFile を呼び出します。
ファイルの削除と同時に、キャッシュを更新するときは、DeleteFile を呼び出します。
g_FileHashCache.DeleteFile  "File.txt"
g_FileHashCache.Remove  "File.txt"